#include "comm.hpp"



static int commShm(int size , int falgs)
{
    // ftok为生成进程通信键值的函数
    // 参数相同会生成一样的key  // 导致的效果就是两个进程调用该函数得到是同一块共享内存！
    key_t key = ftok(PATHNAME, PROJ_ID) ;
    if(0 > key)
    {
        perror("ftok error");
        return -1 ;
    }

    int shmid ;
    //参数: key  共享内存大小  权限 

    if(0 > (shmid = shmget(key, size, falgs)) )
    {
        perror("shmget error");
        return -1 ; 
    }

    return shmid ;
}
/*
static int commShm(int size, int flags)
{
 key_t _key = ftok(PATHNAME, PROJ_ID);
 if(_key < 0){
 perror("ftok");
 return -1;
 }
 int shmid = 0;
 if( (shmid = shmget(_key, size, flags)) < 0){
 perror("shmget");
 return -2;
 }
 return shmid; 
}
*/

int destroyShm(int shmid)
{
    if(shmctl(shmid, IPC_RMID, NULL) < 0)
    {
        perror("shmctl error\n"); 
        return -1 ;
    }

    printf("\n ipc destory success \n") ;
    return 0  ;
}


int createShm(int size)
{
    //IPC_CREAT表示如果共享内存不存在，则创建一个新的共享内存；IPC_EXCL表示如果共享内存已经存在，则创建失败；
    return commShm(size, IPC_CREAT | IPC_EXCL | 0666) ; 
}

int getShm(int size)
{
    return commShm(size, IPC_CREAT) ; 
}